﻿#include "StdAfx.h"
#include "dh2_main.h"

dh2_main::dh2_main(void)
{
	this->name = "uncharted waters 2 remake project";
	this->window_width = 640;
	this->window_height = 480;
	this->frame_rate = 20;

	//이전 플래그 초기화
	this->direction[0] = 0;
	this->direction[1] = 0;
	this->direction[2] = 0;
	this->direction[3] = 0;
}

dh2_main::~dh2_main(void)
{

}
bool dh2_main::init()
{
	bool init_flag = false;
	//sdl_sub 초기화
	//비디오, 사운드, image, keyboard 등등
	init_flag = this->sdl.init(this->name, this->window_width, this->window_height);
 
	return init_flag;
}
bool dh2_main::setup()
{
	//자체 설정파일과 
	//준비작업을 함
	//레이아웃을 제외한 표시영역(이동가능 영역)
	this->layout_rect.x = 96;
	this->layout_rect.y = 48;
	this->layout_rect.w = 384;
	this->layout_rect.h = 384;

	//배경 조정을위한 정보를 설정하는 부분 필요
	//타일셋 뿌리기 관련해서 관련 수정 필요
	this->back_image.load("background.bmp");
	color colorkey(0, 255, 0);
	this->back_image.load("refresh640_480.bmp");
	this->layout.load("page_layout.png", &colorkey);


	dh2_object * player = new dh2_object();
	color t_color(0, 255, 0);
	player->ch_img.load("walk_ani.png",&t_color, 8);
	player->set("pietro conti",300,300);
	this->ol.add(player);

	
	return true;
}

//이벤트 체크
void dh2_main::event()
{
	while(sdl.checkEvent()){
		this->flag_quit = sdl.check_quit(); //종료조건 체크
		this->set_direction(); //방향키 체크
	}
}
void dh2_main::set_direction()
{
	switch(sdl.check_arrowkey())
	{
		case 1: direction[0] = 1; break; //up 설정
		case 2: direction[1] = 1; break; //down
		case 3: direction[2] = 1; break; //left
		case 4: direction[3] = 1; break; //right
		case 5: direction[0] = 0; break; //up 해제
		case 6: direction[1] = 0; break; //down
		case 7: direction[2] = 0; break; //left
		case 8: direction[3] = 0; break; //right
	}
}
void dh2_main::set_move()
{
	// 여러개의 오브젝트의 이동을 처리해주기 위해서 
	// 이 부분을 개선해야 될 필요가 있음 type 코드 등으로 구분해서 플레이어인 것과 플레이어가 아닌 것등을 구분해줘야 됨 
	dh2_object * move_dst = ol.get("pietro conti");
	SDL_Rect dir_xy;
	int target_x = 0, target_y = 0;
	int add = 10; //해당 이동방향 이동거리(px)
	dir_xy.y = (direction[1] - direction[0])*add; //상하
	dir_xy.x = (direction[3] - direction[2])*add; //좌우

	dir_xy = check_layout(dir_xy, move_dst->xy);

	cout<<"x:"<<move_dst->xy.x<<" y:"<<move_dst->xy.y<<endl;
	move_dst->set_xy(dir_xy.x,dir_xy.y);
}
//레이아웃 범위 내에서 움직임이 가능한지 어떤지 판단
SDL_Rect dh2_main::check_layout(SDL_Rect dir, SDL_Rect xy) 
{
	if( ((dir.x+xy.x) > layout_rect.x) 
		&& ((dir.y + xy.y) > layout_rect.y) 
		&& ((xy.h +xy.y+dir.y)< layout_rect.h+layout_rect.y) 
		&& ((xy.w +xy.x+dir.x)< layout_rect.w+layout_rect.x))
	{
		xy.x = xy.x + dir.x;
		xy.y = xy.y + dir.y;
	}
	return xy;
}
void dh2_main::bg_update()
{


	sdl.set(&back_image);
	sdl.set(&layout);
}
//진행
void dh2_main::set_ol()
{
	bool loops = true;
	for(int i=0; i < ol.getCount(); i++)
	{
		dh2_object * view_obj = ol.get();
		if(view_obj != NULL)
		{
			if(view_obj->flag_view)
				sdl.set(view_obj->getImage());
		}
		else break; 
	}
}
bool dh2_main::start()
{
	//종료 플래그 설정
	this->flag_quit = false;

	while(flag_quit == false)
	{
		event(); //이벤트 체크  - 이벤트 관련 설정은 이 메서드에서 설정
		bg_update(); //배경출력
		set_move(); //이동 설정(방향을 받아서 다음 좌표를 지정)
		set_ol(); //설정된 오브젝트들을 화면에 셋
		sdl.view();	//화면에 뿌려주기
		sdl.check_fps(this->frame_rate);
	}
	return true;
}

